先來個簡單範例
class Info {
var id: Int=0
var name: String=""
var number: String=""
fun printNnumber(){
println("***** $number")
}
}
這邊介紹幾個常用的用法
T是泛指變數或物件,在後方使用run、with等方法
可以將 run 視作是一個封閉的執行範圍, 但是run 會把最後一行的東西傳出或是帶到下一個關連使用
run
舉個例子
run{
var InfoA=Info()
InfoA.id=1
InfoA.name="Apple2"
InfoA.number="123456"
var newNumber="456789"
InfoA.number=newNumber
InfoA
}.printNnumber()
在run裡面可以建立本地變數newNumber,這個變數只存在於run的範圍內,外部無法操作。
在run執行完畢後,我們發現有執行printNnumber()函式,那是因為最後一行傳出InfoA時,此時可以使用Info內的函式方法。
T.run
var InfoA:Info?=null
var InfoB=InfoA?.run{
this.id=1
this.name="Apple2"
this.number="123456"
var newNumber="456789"
this.number=newNumber
this
}
InfoB?.printId()
InfoB?.printNumber()
InfoB?.printName()
run的最後一行會被傳出,所以變數InfoB的型態就被指定為InfoA,並且擁有在run裡面所設定的值。
T.run可以判斷空值操作,如果為空值則後方的run就不執行。
如果不為空值,藉由T.run最後一行傳回this,讓InfoB去使用時,此時InfoB會被轉型成InfoA?。
因此使用Info內函式時,都需要加上?去作空值的安全檢查。
run內部用this來作操作。
var InfoB:Info?=null
var InfoB=with(Info()){
this.id=1
this.name="Apple2"
this.number="123456"
this
}
InfoB?.printId()
InfoB?.printNumber()
InfoB?.printName()
with沒有T.with的用法。
大致上跟run的用法差不多,一樣是回傳範圍內最後一行,內部也是用this。
差異在使用with時,需要傳入變數,而這變數一樣有需要空值的安全性檢查。
到這邊,有沒有發現this這個詞很眼熟?
沒錯,在kotlin我們對this有另一個用法,像是要存取context、activity等,通常都會寫成this.context,this.activity。
這樣我們在這些範圍內的存取,又該怎麼宣告?
this@MainActivity
使用@後方接對象來區分。
如果要避免this的用法造成困擾,我們可以使用let。
let{
var InfoC=Info()
InfoC.id=3
InfoC.name="Cindy"
InfoC.number="9876554"
InfoC
}.printNumber()
var InfoC=Info().let{
it.id=3
it.name="Cindy"
it.number="9876554"
it
}
這邊內部使用的就是it,其他的部分都跟run、with用法一樣,回傳範圍內最後一項。
var InfoD=Info().also{
it.id=4
it.name="Dina"
it.number="999999"
}
T.also,沒有回傳最後一項的用法,他會將also自身傳回去,一樣使用it來操作。
如果說,我們有點想念this的用法,又想要用also的方式..
var InfoE=Info().apply{
this.id=5
this.name="Eva"
this.number="888888"
}
InfoE.printName()
我們還有一個叫apply的用法可以用。
一樣回傳自身,使用this操作...
那麼歸納用法吧